home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-03-17 | 20.8 KB | 862 lines | [TEXT/KAHL] |
- /*
- File: StdPrefsTester.c
-
- Contains: Standard preferences library tester routines.
-
- This test app is just that - a test app. You should
- do a LOT more error checking in your own application
- code!
-
- Refer to develop Issue 18, "The Right Way to Implement
- Preferences Files", for additional details on this code.
-
- Written by: Gary Woodcock
-
- Copyright: © 1993-94 by Apple Computer, Inc.
-
- Change History (most recent first):
-
- 3/3/94 Version 1.0.
-
- Notes: This code uses Apple's Universal Interfaces for C.
-
- Send bug reports to Gary Woodcock at AOL: gwoodcock
- or Internet: gwoodcock@aol.com.
- */
-
- //-----------------------------------------------------------------------
- // Includes
-
- #include "StdPrefsTester.h"
- #include "CompileFlags.h"
-
- #include "StdPrefsLib.h"
-
- #include <Desk.h>
- #include <Dialogs.h>
- #include <Errors.h>
- #include <Fonts.h>
- #include <GestaltEqu.h>
- #include <Menus.h>
- #include <Memory.h>
- #include <OSEvents.h>
- #include <Packages.h>
- #include <QuickDraw.h>
- #include <Resources.h>
- #include <ToolUtils.h>
- #include <Windows.h>
-
- //-----------------------------------------------------------------------
- // Constants
-
- // Apple menu items
- enum
- {
- kAboutItem = 1
- };
-
- // File menu items
- enum
- {
- kQuitItem = 1
- };
-
- // Edit menu items
- enum
- {
- kUndoItem = 1,
- kCutItem = 3,
- kCopyItem,
- kPasteItem,
- kClearItem
- };
-
- // Test menu items
- enum
- {
- kNewPrefsFileItem = 1,
- kDeletePrefsFileItem,
- kDeletePrefsFolderItem,
- kGetPrefsFileVers1Item = 5,
- kSetPrefsFileVers1Item,
- kGetPrefsFileVers2Item,
- kSetPrefsFileVers2Item,
- kReadPrefsItem = 10,
- kWritePrefsItem,
- kDeletePrefsItem
- };
-
- // About box dialog DITL items
- enum
- {
- kAboutOKButton = 1,
- kAboutOKButtonOutline
- };
-
- //-----------------------------------------------------------------------
- // Globals
-
- EventRecord gTheEvent;
- MenuHandle gAppleMenu;
- MenuHandle gFileMenu;
- MenuHandle gEditMenu;
- MenuHandle gTestMenu;
- Boolean gQuitFlag;
- Boolean gDummyPrefsFileExists;
- Boolean gBogusPrefsFileExists;
-
- //-----------------------------------------------------------------------
- // Prototypes
-
- static void
- DoInit (void);
-
- static void
- DoMenuSetup (void);
-
- static void
- HandleEvent (void);
-
- static void
- HandleMouseDown (void);
-
- static void
- AdjustMenus (void);
-
- static void
- Enable (Handle menu, short item, Boolean ok);
-
- static void
- HandleMenu (long menu);
-
- static void
- DoAboutDialog (void);
-
- static pascal void
- StdPrefsTesterDrawProc (DialogPtr theDialog, short theItemNum);
-
- //-----------------------------------------------------------------------
-
- main (void)
- {
- // Init
- DoInit();
- DoMenuSetup();
-
- // Eat events until done
- do
- {
- HandleEvent();
- }
- while (!gQuitFlag);
-
- // Take off, eh?
- ExitToShell();
- }
-
- //-----------------------------------------------------------------------
-
- static void
- DoInit (void)
- {
- OSErr result = noErr;
-
- // Set up quit flag
- gQuitFlag = false;
-
- // MacMantra™
- MaxApplZone();
- InitGraf (&qd.thePort);
- InitFonts();
- FlushEvents (everyEvent, 0);
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs (0L);
- InitCursor();
- MoreMasters();
- MoreMasters();
- MoreMasters();
- MoreMasters();
-
- // Do our test prefs files exist?
- gDummyPrefsFileExists = PreferencesFileExists (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType);
- gBogusPrefsFileExists = PreferencesFileExists (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType);
- }
-
- //-----------------------------------------------------------------------
-
- static void
- DoMenuSetup (void)
- {
- Handle theMenuBar = GetNewMBar (kMenuBarID);
-
- // Set up our menus
- SetMenuBar (theMenuBar);
- gAppleMenu = GetMHandle (kAppleID);
- gFileMenu = GetMHandle (kFileID);
- gEditMenu = GetMHandle (kEditID);
- gTestMenu = GetMHandle (kTestID);
- AddResMenu (gAppleMenu, 'DRVR');
- DrawMenuBar();
- }
-
- //-----------------------------------------------------------------------
-
- static void
- HandleEvent (void)
- {
- Boolean ok = false;
-
- // Do system stuff
- HiliteMenu (0);
- SystemTask();
-
- // Suck an event
- ok = WaitNextEvent (everyEvent, &gTheEvent, 0, 0);
- if (ok)
- {
- // What was it?
- switch (gTheEvent.what)
- {
- case mouseDown: // Handle a mouse down
- {
- HandleMouseDown();
- break;
- }
- case keyDown: // Handle command key equivalents
- case autoKey:
- {
- char theChar = gTheEvent.message & charCodeMask;
- long theMenu = MenuKey (theChar);
-
- HandleMenu (theMenu);
- break;
- }
- default: // For the purposes of testing,
- { // we don't really care about any other events
- break;
- }
- }
- }
- }
-
- //-----------------------------------------------------------------------
-
- static void
- HandleMouseDown (void)
- {
- WindowPtr theWindow;
- short windowCode = FindWindow (gTheEvent.where, &theWindow);
-
- // Where was the mouse down?
- switch (windowCode)
- {
- case inSysWindow: // In a system window
- {
- SystemClick (&gTheEvent, theWindow);
- break;
- }
- case inMenuBar: // In our menu bar
- {
- AdjustMenus();
- HandleMenu (0L);
- break;
- }
- default:
- {
- break;
- }
- }
- }
-
- //-----------------------------------------------------------------------
-
- static void
- AdjustMenus (void)
- {
- register WindowPeek wp = nil;
- short kind = 0;
- Boolean DA = false;
-
- // What kind of window is frontmost?
- wp = (WindowPeek) FrontWindow();
- kind = wp ? wp->windowKind : 0;
- DA = kind < 0;
-
- // Set our menu item states appropriately
-
- // Apple menu
- Enable ((Handle) gAppleMenu, kAboutItem, true);
-
- // File menu
- Enable ((Handle) gFileMenu, kQuitItem, true);
-
- // Edit menu
- Enable ((Handle) gEditMenu, 1, DA);
- Enable ((Handle) gEditMenu, 3, DA);
- Enable ((Handle) gEditMenu, 4, DA);
- Enable ((Handle) gEditMenu, 5, DA);
- Enable ((Handle) gEditMenu, 6, DA);
-
- // Test menu
- Enable ((Handle) gTestMenu, kNewPrefsFileItem,
- !(gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kDeletePrefsFileItem,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kDeletePrefsFolderItem,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kGetPrefsFileVers1Item,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kSetPrefsFileVers1Item,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kGetPrefsFileVers2Item,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kSetPrefsFileVers2Item,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kReadPrefsItem,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kWritePrefsItem,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
- Enable ((Handle) gTestMenu, kDeletePrefsItem,
- (gDummyPrefsFileExists && gBogusPrefsFileExists));
-
- // Draw the menu bar
- DrawMenuBar();
- }
-
- //-----------------------------------------------------------------------
-
- static void
- Enable (Handle menu, short item, Boolean ok)
- {
- // Utility routine to enable and disable menu items
- if (ok)
- {
- EnableItem ((MenuHandle) menu, item);
- }
- else
- {
- DisableItem ((MenuHandle) menu, item);
- }
- }
-
- //-----------------------------------------------------------------------
-
- static void
- HandleMenu (long theMenu)
- {
- long mSelect;
- short menuID;
- short menuItem;
-
- // Did we get a menu?
- if (theMenu == 0L)
- {
- // Nope, get it from menu select
- mSelect = MenuSelect (gTheEvent.where);
- }
- else
- {
- // Yep, use it
- mSelect = theMenu;
- }
-
- // Decode it
- menuID = HiWord (mSelect);
- menuItem = LoWord (mSelect);
-
- // Which menu is it?
- switch (menuID)
- {
- // Apple menu
- case kAppleID:
- {
- if (menuItem == kAboutItem)
- {
- DoAboutDialog();
- }
- else // It's a DA
- {
- Str255 name;
- GrafPtr savedPort;
-
- // Open the DA
- GetPort (&savedPort);
- GetItem (gAppleMenu, menuItem, name);
- OpenDeskAcc (name);
- SetPort (savedPort);
- }
- break;
- }
-
- // File menu
- case kFileID:
- {
- if (menuItem == kQuitItem)
- {
- // Set quit flag
- gQuitFlag = true;
- }
- break;
- }
-
- // Edit menu
- case kEditID:
- {
- if (!SystemEdit (menuItem - 1))
- {
- // We don't really do anything here - feel free to implement something
- // yourself if you want
- SysBeep(5);
- }
- break;
- }
-
- // Test menu
- case kTestID:
- {
- Str255 versNumStr = "\p1.0.1d1";
- Str255 companyStr = "\p1.0.1d1 (US), © Apple Computer, Inc. 1993-94";
- Str255 fileSetStr = "\p(for StdPrefsTester 1.0)";
- Str255 shortVersionStr;
- Str255 longVersionStr;
- NumVersion numVersion;
- Handle prefHdl;
- OSErr result = noErr;
- short regionCode;
- short id;
- short dummyFRefNum;
- short bogusFRefNum;
-
- // What menu item was it?
- switch (menuItem)
- {
- case kNewPrefsFileItem: // New preferences file
- {
- // Does "Dummy Prefs" exist?
- if (!gDummyPrefsFileExists)
- {
- // Nope - Create "Dummy Prefs" in "Dummy Prefs ƒ" in
- // either Preferences folder or System Folder
- result = NewPreferencesFile (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType, "\pDummy Prefs", "\pDummy Prefs ƒ",
- "\pthe application StdPrefsTester");
- if (result == noErr)
- {
- gDummyPrefsFileExists = true;
- }
- }
-
- // Does "Bogus Prefs" exist?
- if (!gBogusPrefsFileExists)
- {
- // Nope - Create "Bogus Prefs" in either Preferences
- // folder or System Folder
- result = NewPreferencesFile (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType,"\pBogus Prefs", nil,
- "\pthe application StdPrefsTester");
- if (result == noErr)
- {
- gBogusPrefsFileExists = true;
- }
- }
- break;
- }
- case kDeletePrefsFileItem: // Delete preferences file
- {
- // Delete "Dummy Prefs"
- result = DeletePreferencesFile (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType);
- if (result == noErr)
- {
- gDummyPrefsFileExists = false;
- }
-
- // Delete "Bogus Prefs"
- result = DeletePreferencesFile (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType);
- if (result == noErr)
- {
- gBogusPrefsFileExists = false;
- }
- break;
- }
- case kDeletePrefsFolderItem: // Delete preferences folder
- {
- // Delete "Dummy Prefs ƒ" folder, along with its contents
- result = DeletePreferencesFolder ("\pDummy Prefs ƒ");
- if (result == noErr)
- {
- gDummyPrefsFileExists = false;
- }
- break;
- }
- case kGetPrefsFileVers1Item: // Get preferences file version 1 resource
- {
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kDummyPrefsFileType,
- &dummyFRefNum);
- if (result == noErr)
- {
- // Get the contents of the vers 1 resource
- result = GetPreferencesFileVersion (dummyFRefNum, kVers1, &numVersion,
- ®ionCode, shortVersionStr, longVersionStr);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kBogusPrefsFileType,
- &bogusFRefNum);
- if (result == noErr)
- {
- // Get the contents of the vers 1 resource
- result = GetPreferencesFileVersion (bogusFRefNum, kVers1, &numVersion,
- ®ionCode, shortVersionStr, longVersionStr);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- case kSetPrefsFileVers1Item: // Set preferences file version 1 resource
- {
- numVersion.majorRev = 0x01;
- numVersion.minorAndBugRev = 0x01;
- numVersion.stage = developStage;
- numVersion.nonRelRev = 0x01;
- regionCode = GetEnvirons (smRegionCode); // Does this work for System 6?
-
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kDummyPrefsFileType,
- &dummyFRefNum);
- if (result == noErr)
- {
- // Set the contents of the vers 1 resource
- result = SetPreferencesFileVersion (dummyFRefNum, kVers1, &numVersion,
- regionCode, versNumStr, companyStr);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kBogusPrefsFileType,
- &bogusFRefNum);
- if (result == noErr)
- {
- // Set the contents of the vers 1 resource
- result = SetPreferencesFileVersion (bogusFRefNum, kVers1, &numVersion,
- regionCode, versNumStr, companyStr);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- case kGetPrefsFileVers2Item: // Get preferences file version 2 resource
- {
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kDummyPrefsFileType,
- &dummyFRefNum);
- if (result == noErr)
- {
- // Get the contents of the vers 2 resource
- result = GetPreferencesFileVersion (dummyFRefNum, kVers2, &numVersion,
- ®ionCode, shortVersionStr, longVersionStr);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kBogusPrefsFileType,
- &bogusFRefNum);
- if (result == noErr)
- {
- // Get the contents of the vers 2 resource
- result = GetPreferencesFileVersion (bogusFRefNum, kVers2, &numVersion,
- ®ionCode, shortVersionStr, longVersionStr);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- case kSetPrefsFileVers2Item: // Set preferences file version 2 resource
- {
- numVersion.majorRev = 0x01;
- numVersion.minorAndBugRev = 0x01;
- numVersion.stage = developStage;
- numVersion.nonRelRev = 0x01;
- regionCode = GetEnvirons (smRegionCode); // Does this work for System 6?
-
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kDummyPrefsFileType,
- &dummyFRefNum);
- if (result == noErr)
- {
- // Set the contents of the vers 2 resource
- result = SetPreferencesFileVersion (dummyFRefNum, kVers2, &numVersion,
- regionCode, versNumStr, fileSetStr);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator, kBogusPrefsFileType,
- &bogusFRefNum);
- if (result == noErr)
- {
- // Set the contents of the vers 2 resource
- result = SetPreferencesFileVersion (bogusFRefNum, kVers2, &numVersion,
- regionCode, versNumStr, fileSetStr);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- case kReadPrefsItem: // Read preference
- {
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType, &dummyFRefNum);
- if (result == noErr)
- {
- // Read the first resource of type 'myPf'
- result = ReadPreference (dummyFRefNum, 'myPf', nil, &prefHdl);
-
- // Read the first resource of type 'myPf' and return its
- // resource ID
- id = 0;
- result = ReadPreference (dummyFRefNum, 'myPf', &id, &prefHdl);
-
- // Read the resource of type 'myPf' and ID 128
- id = 128;
- result = ReadPreference (dummyFRefNum, 'myPf', &id, &prefHdl);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType, &bogusFRefNum);
- if (result == noErr)
- {
- // Read the first resource of type 'myPf'
- result = ReadPreference (bogusFRefNum, 'myPf', nil, &prefHdl);
-
- // Read the first resource of type 'myPf' and return its
- // resource ID
- id = 0;
- result = ReadPreference (bogusFRefNum, 'myPf', &id, &prefHdl);
-
- // Read the resource of type 'myPf' and ID 128
- id = 128;
- result = ReadPreference (bogusFRefNum, 'myPf', &id, &prefHdl);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- case kWritePrefsItem: // Write preference
- {
- // Create a handle for our preference data
- prefHdl = NewHandle (sizeof (long));
- if (prefHdl != nil)
- {
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType, &dummyFRefNum);
- if (result == noErr)
- {
- // Set the contents of the preference data to 10
- **((long**)prefHdl) = 10L;
-
- // Write the preference data to "Dummy Prefs"
- result = WritePreference (dummyFRefNum, 'myPf', nil, prefHdl);
-
- // Set the contents of the preference data to 20
- **((long**)prefHdl) = 20L;
-
- // Write the preference data to "Dummy Prefs" and return
- // its resource ID in the file
- id = 0;
- result = WritePreference (dummyFRefNum, 'myPf', &id, prefHdl);
-
- // Set the contents of the preference data to 30
- **((long**)prefHdl) = 30L;
-
- // Write the preference data to "Dummy Prefs" with an ID
- // of 128
- id = 128;
- result = WritePreference (dummyFRefNum, 'myPf', &id, prefHdl);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType, &bogusFRefNum);
- if (result == noErr)
- {
- // Set the contents of the preference data to 10
- **((long**)prefHdl) = 10L;
-
- // Write the preference data to "Bogus Prefs"
- result = WritePreference (bogusFRefNum, 'myPf', nil, prefHdl);
-
- // Set the contents of the preference data to 20
- **((long**)prefHdl) = 20L;
-
- // Write the preference data to "Bogus Prefs" and return
- // its resource ID in the file
- id = 0;
- result = WritePreference (bogusFRefNum, 'myPf', &id, prefHdl);
-
- // Set the contents of the preference data to 30
- **((long**)prefHdl) = 30L;
-
- // Write the preference data to "Bogus Prefs" with an ID
- // of 128
- id = 128;
- result = WritePreference (bogusFRefNum, 'myPf', &id, prefHdl);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
-
- // Clean up
- DisposeHandle (prefHdl);
- }
- break;
- }
- case kDeletePrefsItem: // Delete preference
- {
- // Open "Dummy Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kDummyPrefsFileType, &dummyFRefNum);
- if (result == noErr)
- {
- // Delete the preference data of type 'myPf' with ID 128
- result = DeletePreference (dummyFRefNum, 'myPf', 128);
-
- // Delete the first preference data found of type 'myPf'
- result = DeletePreference (dummyFRefNum, 'myPf', 0);
-
- // Close "Dummy Prefs"
- result = ClosePreferencesFile (dummyFRefNum);
- }
-
- // Open "Bogus Prefs"
- result = OpenPreferencesFile (kDummyStdPrefsTesterCreator,
- kBogusPrefsFileType, &bogusFRefNum);
- if (result == noErr)
- {
- // Delete the preference data of type 'myPf' with ID 128
- result = DeletePreference (bogusFRefNum, 'myPf', 128);
-
- // Delete the first preference data found of type 'myPf'
- result = DeletePreference (bogusFRefNum, 'myPf', 0);
-
- // Close "Bogus Prefs"
- result = ClosePreferencesFile (bogusFRefNum);
- }
- break;
- }
- default:
- {
- break;
- }
- }
- break;
- }
- default:
- {
- break;
- }
- }
- }
-
- //-----------------------------------------------------------------------
-
- static void
- DoAboutDialog (void)
- {
- DialogPtr aboutDialog = GetNewDialog (kAboutDialogID, nil, (WindowPtr)-1L);
-
- // Do the boring about dialog
- if (aboutDialog != nil)
- {
- Rect itemRect;
- Handle itemHandle;
- short itemHit;
- short itemType;
-
- GetDItem (aboutDialog, kAboutOKButtonOutline, &itemType, &itemHandle, &itemRect);
- SetDItem (aboutDialog, kAboutOKButtonOutline, itemType,
- (Handle) StdPrefsTesterDrawProc, &itemRect);
-
- ShowWindow (aboutDialog);
-
- do
- {
- ModalDialog (nil, &itemHit);
- }
- while (itemHit != kAboutOKButton);
-
- DisposDialog (aboutDialog);
- }
- }
-
- //-----------------------------------------------------------------------
-
- static pascal void
- StdPrefsTesterDrawProc (DialogPtr theDialog, short theItemNum)
- {
- PenState thePenState;
- Rect itemRect;
- Handle itemHandle;
- short itemType;
-
- // Save the pen
- GetPenState (&thePenState);
-
- // Get the item rect
- GetDItem (theDialog, theItemNum, &itemType, &itemHandle, &itemRect);
-
- // What item do we need to draw?
- switch (theItemNum)
- {
- case kAboutOKButtonOutline:
- {
- // Draw the OK button outline
- PenNormal();
- PenMode (patCopy);
- PenSize (3, 3);
- InsetRect (&itemRect, -4, -4);
- FrameRoundRect (&itemRect, 16, 16);
- break;
- }
- default:
- {
- break;
- }
- }
-
- // Restore the pen
- SetPenState (&thePenState);
- }
-
- //-----------------------------------------------------------------------
-
-